<?php

/**
 * AccesoController
 * 
 * @package sgit_development
 * @author juanma
 * @copyright 2011
 * @version $Id$
 * @access public
 */
class AccesoController extends Sgit_Controller_Action
{

    protected $_main_model = 'AclAccesos';

    protected function _begin()
    {
        $this->_model->AclResources = new Application_Model_AclResources();
        $this->_model->AclGroup = new Application_Model_AclGroup();
        $this->_model->Usuario = new Application_Model_Usuario();

    }

    /**
     * AccesoController::indexAction()
     * 
     * @return
     */
    public function indexAction()
    {


        $lastRequest = new Zend_Session_Namespace('MyFlash');

        $controller = strtolower($this->_getParam('controlador', $lastRequest->controlador));

        $this->_element->controlador = new Sgit_Form_Element_Select_Controller('controlador');
        $this->_element->controlador->setValue($controller);

        $filtros = new Sgit_Form_Filtros();
        $filtros->addFormSelect($this->_element->controlador);

        $values = $this->_getFiltrosValues($filtros);
        $filtros->myRender();

        $keyResource = $controller;

        if ($controller)
        {

            if (strpos($controller, ':'))
            {
                list($controller, $idZona) = explode(':', $controller);
            }

            $filter = new Zend_Filter_Word_UnderscoreToCamelCase();
            $filter->setSeparator('-');
            $controlador = $filter->filter($controller);

            require_once (APPLICATION_PATH . "/controllers/" . $controlador . "Controller.php");
            $metodos = get_class_methods($controlador . 'Controller');
        } else
        {
            return true;
        }


        $options_grupos = $this->_model->AclGroup->getAssoc('id', 'grupo', null, 'grupo');
        $options_usuarios = $this->_model->Usuario->getAssoc('id', 'nombre', array('estado=?' => 1), 'nombre');

        $decorator = array('ViewHelper', 'Errors', array(array('data' => 'HtmlTag'), array('tag' => 'br', 'class' => 'element')), array('Label', array('tag' => '')), array(array('row' => 'HtmlTag'), array('tag' => 'br')), );


        $i = 0;

        $accesos = $this->_llenarCombo($keyResource, 1);
        $accesos_deny = $this->_llenarCombo($keyResource, 0);


        $grupos_allow = new Zend_Form_Element_MultiCheckbox('grupos_');
        $grupos_allow->setMultiOptions($options_grupos)->setDecorators($decorator);
        $grupos_allow->setValue($accesos['grupos']);

        $grupos_deny = new Zend_Form_Element_MultiCheckbox('gruposdeny_');
        $grupos_deny->setMultiOptions($options_grupos)->setDecorators($decorator);
        $grupos_deny->setValue($accesos_deny['grupos']);


        $usuarios_allow = new Zend_Form_Element_MultiCheckbox('users_');
        $usuarios_allow->setMultiOptions($options_usuarios)->setDecorators($decorator);
        $usuarios_allow->setValue($accesos['users']);

        $usuarios_deny = new Zend_Form_Element_MultiCheckbox('usersdeny_');
        $usuarios_deny->setMultiOptions($options_usuarios)->setDecorators($decorator);
        $usuarios_deny->setValue($accesos_deny['users']);


        foreach ((array )$grupos_allow->getValue() as $v)
        {
            $metodo[$i]['key_grupos_allow'][] = $options_grupos[$v];
        }
        if ($metodo[$i]['key_grupos_allow'])
            $metodo[$i]['key_grupos_allow'] = implode('<br>', $metodo[$i]['key_grupos_allow']);

        foreach ((array )$grupos_deny->getValue() as $v)
        {
            $metodo[$i]['key_grupos_deny'][] = $options_grupos[$v];
        }
        if ($metodo[$i]['key_grupos_deny'])
            $metodo[$i]['key_grupos_deny'] = implode('<br>', $metodo[$i]['key_grupos_deny']);

        foreach ((array )$usuarios_allow->getValue() as $v)
        {
            $metodo[$i]['key_usuarios_allow'][] = $options_usuarios[$v];
        }
        if ($metodo[$i]['key_usuarios_allow'])
            $metodo[$i]['key_usuarios_allow'] = implode('<br>', $metodo[$i]['key_usuarios_allow']);

        foreach ((array )$usuarios_deny->getValue() as $v)
        {
            $metodo[$i]['key_usuarios_deny'][] = $options_usuarios[$v];
        }
        if ($metodo[$i]['key_usuarios_deny'])
            $metodo[$i]['key_usuarios_deny'] = implode('<br>', $metodo[$i]['key_usuarios_deny']);


        $metodo[$i]['action'] = 'Todas las acciones de este controlador';
        $metodo[$i]['grupos_allow'] = $grupos_allow;
        $metodo[$i]['grupos_deny'] = $grupos_deny;
        $metodo[$i]['usuarios_allow'] = $usuarios_allow;
        $metodo[$i]['usuarios_deny'] = $usuarios_deny;


        //si cheack auth =0 lo eliminamos
        $resour = $this->_model->AclResources->GetRow(array('resource = ?' => $keyResource));
        if (is_array($resour) && $resour['check_auth'] == 0)
        {
            unset($metodo[$i]);
        }


        foreach ($metodos as $v)
        {
            if (in_array($v, array('deniedAction', 'registerAction')))
                continue;


            if (strpos($v, 'Action'))
            {
                


                $i++;
                $metodo[$i]['action'] = str_replace('Action', '', $v);

                if ($idZona)
                    $resource = strtolower($controller . ':' . $metodo[$i]['action'] . ':' . $idZona);
                else
                    $resource = strtolower($controller . ':' . $metodo[$i]['action']);

                $resour = $this->_model->AclResources->GetRow(array('resource = ?' => $resource));
                //si cheack auth =0 lo eliminamos
                if (is_array($resour) && $resour['check_auth'] == 0)
                {
                    unset($metodo[$i]);
                    continue;
                }


                $accesos = $this->_llenarCombo($resource, 1);
                $accesos_deny = $this->_llenarCombo($resource, 0);

                $grupos_allow = new Zend_Form_Element_MultiCheckbox('grupos_' . $metodo[$i]['action']);
                $grupos_allow->setMultiOptions($options_grupos)->setDecorators($decorator);
                $grupos_allow->setValue($accesos['grupos']);

                $grupos_deny = new Zend_Form_Element_MultiCheckbox('gruposdeny_' . $metodo[$i]['action']);
                $grupos_deny->setMultiOptions($options_grupos)->setDecorators($decorator);
                $grupos_deny->setValue($accesos_deny['grupos']);

                $usuarios_allow = new Zend_Form_Element_MultiCheckbox('users_' . $metodo[$i]['action']);
                $usuarios_allow->setMultiOptions($options_usuarios)->setDecorators($decorator);
                $usuarios_allow->setValue($accesos['users']);

                $usuarios_deny = new Zend_Form_Element_MultiCheckbox('usersdeny_' . $metodo[$i]['action']);
                $usuarios_deny->setMultiOptions($options_usuarios)->setDecorators($decorator);
                $usuarios_deny->setValue($accesos_deny['users']);


                foreach ((array )$grupos_allow->getValue() as $v)
                {
                    $metodo[$i]['key_grupos_allow'][] = $options_grupos[$v];
                }
                if ($metodo[$i]['key_grupos_allow'])
                    $metodo[$i]['key_grupos_allow'] = implode('<br>', $metodo[$i]['key_grupos_allow']);

                foreach ((array )$grupos_deny->getValue() as $v)
                {
                    $metodo[$i]['key_grupos_deny'][] = $options_grupos[$v];
                }
                if ($metodo[$i]['key_grupos_deny'])
                    $metodo[$i]['key_grupos_deny'] = implode('<br>', $metodo[$i]['key_grupos_deny']);

                foreach ((array )$usuarios_allow->getValue() as $v)
                {
                    $metodo[$i]['key_usuarios_allow'][] = $options_usuarios[$v];
                }
                if ($metodo[$i]['key_usuarios_allow'])
                    $metodo[$i]['key_usuarios_allow'] = implode('<br>', $metodo[$i]['key_usuarios_allow']);

                foreach ((array )$usuarios_deny->getValue() as $v)
                {
                    $metodo[$i]['key_usuarios_deny'][] = $options_usuarios[$v];
                }
                if ($metodo[$i]['key_usuarios_deny'])
                    $metodo[$i]['key_usuarios_deny'] = implode('<br>', $metodo[$i]['key_usuarios_deny']);


                $metodo[$i]['grupos_allow'] = $grupos_allow;
                $metodo[$i]['grupos_deny'] = $grupos_deny;
                $metodo[$i]['usuarios_allow'] = $usuarios_allow;
                $metodo[$i]['usuarios_deny'] = $usuarios_deny;
            }


        }
        


        $this->view->metodos = $metodo;
        $this->view->controlador = $keyResource;

    }

    protected function _llenarCombo($keyresource, $allow = 1)
    {
        $keyresource = trim(strtolower($keyresource), ':');


        $cols = $this->_model->default->getCol('id_rol', array('id_resource=?' => $keyresource, 'allow=?' => $allow));
        foreach ((array )$cols as $v)
        {
            if (is_numeric($v))
            {
                $salida['users'][] = $v;
            } else
            {
                $salida['grupos'][] = str_replace('group_', '', $v);
            }

        }

        return $salida;
    }


    public function editarAction()
    {
        $this->_helper->layout->disableLayout();
        $this->_helper->viewRenderer->setNoRender(true);


        $controller = $this->_getParam('controlador');
        $params = $this->getRequest()->getParams();

        $resource = $controller;
        if ($controller)
        {

            if (strpos($controller, ':'))
            {
                list($controller, $idZona) = explode(':', $controller);
            }

            //para conseguir el nombre del controlador de data-telco a dataTelco
            $filter = new Zend_Filter_Word_UnderscoreToCamelCase();
            $filter->setSeparator('-');
            $controlador = $filter->filter($controller);

            require_once (APPLICATION_PATH . "/controllers/" . $controlador . "Controller.php");
            $metodos = get_class_methods($controlador . 'Controller');
        }

        foreach ($metodos as $v)
        {
            if (strpos($v, 'Action'))
            {
                if (in_array($v, array('deniedAction', 'registerAction')))
                    continue;

                $accion = str_replace('Action', '', $v);

                if ($idZona)
                    $keyresource = strtolower($controller . ':' . $accion . ':' . $idZona);
                else
                    $keyresource = strtolower($controller . ':' . $accion);

                $this->_model->default->deleteRow(array('id_resource=?' => $keyresource));
            }
        }


        $this->_model->default->deleteRow(array('id_resource=?' => strtolower($resource)));


        foreach ($params as $k => $v)
        {
            $key = strstr($k, '_', true);
            $accion = trim(strstr($k, '_'), '_');

            if ($idZona)
                $partZona = ':' . $idZona;
            if ($accion)
                $partAccion = ':' . $accion;


            $keyresource = strtolower($controller . $partAccion . $partZona);


            switch ($key)
            {
                case 'grupos':
                    /*
                    if(!empty($accion)){
                        $v=array_merge($v,$params['grupos_']);
                        $v=array_unique($v);
                    }*/
                    
                    $this->_guardaAcceso($v, $keyresource, 'grupo', 1);
                    break;
                case 'users':
                    $this->_guardaAcceso($v, $keyresource, 'user', 1);
                    break;
                case 'gruposdeny':
                    $this->_guardaAcceso($v, $keyresource, 'grupo', 0);
                    break;
                case 'usersdeny':
                    $this->_guardaAcceso($v, $keyresource, 'user', 0);
                    break;
                default:

            }

        }


        $this->_updateAcl();


        $this->_helper->FlashMessenger('Cambios realizados con exito');


        $lastRequest = new Zend_Session_Namespace('MyFlash');
        $lastRequest->setExpirationHops(1);
        $lastRequest->controlador = $resource;

        $this->postDispatch();
        $this->_helper->redirector('index');

    }

    protected function _guardaAcceso($ids, $keyresource, $tipoRol, $allow)
    {
        $rol = ($tipoRol == 'grupo') ? 'group_' : '';
        $data['id_resource'] = $keyresource;
        $data['allow'] = $allow;
        foreach ($ids as $v)
        {
            $data['id_rol'] = $rol . $v;
            $this->_model->default->insert($data);
        }

        return true;

    }


    public function whoAction()
    {

        if ($this->getRequest()->isXmlHttpRequest())
        {
            //throw new Zend_Controller_Exception($this->_controllerName . ':' . $this->_actionName . ' Solo se puede acceder via ajax');
            $this->_helper->layout->disableLayout();
        }


        $controller = trim($this->_getParam('controlador'),':');
        $resource=$controller;

        if (strpos($controller, ':'))
        {
            list($controller, $idZona) = explode(':', $controller);
        }

        $filter = new Zend_Filter_Word_UnderscoreToCamelCase();
        $filter->setSeparator('-');
        $controlador = $filter->filter($controller);


        require_once (APPLICATION_PATH . "/controllers/" . $controlador . "Controller.php");
        $metodos = get_class_methods($controlador . 'Controller');



        foreach ($metodos as $v)
        {
            if (in_array($v, array('deniedAction', 'registerAction')))
                continue;
            if (strpos($v, 'Action'))
            {
                $metodo[] = str_replace('Action', '', $v);
            }
        }


        $acccionpadre = $this->_model->AclResources->GetAll(array('resource = ?' => strtolower($resource), 'check_auth=?' => 1));
        $accciones = $this->_model->AclResources->GetAll(array('parent = ?' => strtolower($resource), 'check_auth=?' => 1));

        $accciones = array_merge((array )$acccionpadre , (array )$accciones);

        $keyparent = strtolower($resource);
        $rows1 = $this->_acl->getRules($keyparent);


        foreach ($accciones as $v)
        {
            $keyresource = $v['resource'];
            $keynotas = $v['notas'];
            $acceso[$keynotas]=array();

            $rows2 = $this->_acl->getRules($keyresource);
            

            $rows = array_merge((array )$rows1, (array )$rows2);


            foreach ((array )$rows['user'] as $v)
            {
                $acceso[$keynotas]['user'][] = $this->_model->Usuario->cacheAssoc($v, 'nombre');
            }
            if(empty($acceso[$keynotas]['user']))$acceso[$keynotas]['user'][]="There aren't users";


            foreach ((array )$rows['group'] as $v)
            {
                $acceso[$keynotas]['group'][] = $this->_model->AclGroup->cacheAssoc($v, 'grupo');
            }
            if(empty($acceso[$keynotas]['group']))$acceso[$keynotas]['group'][]="There aren't groups ";
        }

        $this->view->accesos = $acceso;

    }
    
    
    public function whoallAction()
    {


        $controladores=new Application_Model_AclResources();
        $datacenter=new Application_Model_Datacenter();
        
        $where['parent IS NULL']='';
        $where['check_auth']=1;
        $opt =$controladores->getAssoc('resource','resource',$where);

        foreach($opt as $resource => $controllerText){

        $controller=$resource;

        if (strpos($controller, ':'))
        {
            list($controller, $idZona) = explode(':', $controller);
        }


        $filter = new Zend_Filter_Word_UnderscoreToCamelCase();
        $filter->setSeparator('-');
        $controlador = $filter->filter($controller);



        require_once (APPLICATION_PATH . "/controllers/" . $controlador . "Controller.php");
        $metodos = get_class_methods($controlador . 'Controller');



        foreach ($metodos as $v)
        {
            if (in_array($v, array('deniedAction', 'registerAction')))
                continue;
            if (strpos($v, 'Action'))
            {
                $metodo[] = str_replace('Action', '', $v);
            }
        }


        $acccionpadre = $this->_model->AclResources->GetAll(array('resource = ?' => strtolower($resource), 'check_auth=?' => 1));
        $accciones = $this->_model->AclResources->GetAll(array('parent = ?' => strtolower($resource), 'check_auth=?' => 1));

        $accciones = array_merge((array )$acccionpadre , (array )$accciones);

        $keyparent = strtolower($resource);
        $rows1 = $this->_acl->getRules($keyparent);


        foreach ($accciones as $v)
        {
            $keyresource = $v['resource'];
            $keynotas =$v['resource'].' -> '. $v['notas'] ;
            $acceso[$keynotas]=array();

            $rows2 = $this->_acl->getRules($keyresource);
            

            $rows = array_merge((array )$rows1, (array )$rows2);


            foreach ((array )$rows['user'] as $v)
            {
                $acceso[$keynotas]['user'][] = $this->_model->Usuario->cacheAssoc($v, 'nombre');
            }
            if(empty($acceso[$keynotas]['user']))$acceso[$keynotas]['user'][]="&nbsp;";


            foreach ((array )$rows['group'] as $v)
            {
                $acceso[$keynotas]['group'][] = $this->_model->AclGroup->cacheAssoc($v, 'grupo');
            }
            if(empty($acceso[$keynotas]['group']))$acceso[$keynotas]['group'][]="&nbsp;";
        }

        $access[$controllerText]=$acceso;
        
        
        unset($acceso);
        
        
        }
        $this->view->accesos = $access;
    }
    
    
    
    
    
    


}
